// mapUtils.js
function parseGoogleMapsUrl(url) {
    // 正则表达式匹配 URL 中的经纬度、缩放级别和高度
    const regex = /@(-?\d+\.\d+),(-?\d+\.\d+)(?:,(\d+)([mz]))?/;
    const match = url.match(regex);

    if (!match) {
        throw new Error('Invalid Google Maps URL');
    }

    // 解析经纬度
    const lat = parseFloat(match[1]); // 纬度
    const lng = parseFloat(match[2]); // 经度

    // 初始化 zoom 和 altitude 为 undefined
    let zoom, altitude;

    // 如果有缩放级别或高度信息
    if (match[3] && match[4]) {
        const value = parseFloat(match[3]); // 数值部分
        const unit = match[4]; // 单位（m 或 z）

        if (unit === 'z') {
            // 如果是缩放级别
            zoom = Math.round(value); // 四舍五入为整数
            zoom = Math.max(0, Math.min(22, zoom)); // 限制在 0-22 范围内
        } else if (unit === 'm') {
            // 如果是高度
            altitude = value;
        } else {
            throw new Error('Invalid unit in URL');
        }
    }

    // 返回解析结果
    return {
        latitude: lat,
        longitude: lng,
        zoom: zoom, // 如果没有 zoom 信息，则为 undefined
        altitude: altitude // 如果没有 altitude 信息，则为 undefined
    };
}

function parseGoogleMapsUrl1(url) {
    // 正则表达式匹配 URL 中的经纬度、缩放级别和高度
    const regex = /@(-?\d+\.\d+),(-?\d+\.\d+),(?:(\d+)([mz]))/;
    const match = url.match(regex);

    if (!match) {
        throw new Error('Invalid Google Maps URL');
    }

    // 解析经纬度
    const lat = parseFloat(match[1]); // 纬度
    const lng = parseFloat(match[2]); // 经度

    // 解析缩放级别或高度
    const value = parseFloat(match[3]); // 数值部分
    const unit = match[4]; // 单位（m 或 z）

    let zoom, altitude;

    // 基准缩放级别
    const baseZoom = 19;

    if (unit === 'z') {
        // 如果是缩放级别
        zoom = Math.round(value); // 四舍五入为整数
        zoom = Math.max(0, Math.min(22, zoom)); // 限制在 0-22 范围内
        altitude = 100 * Math.pow(2, baseZoom - zoom); // 根据公式计算高度
    } else if (unit === 'm') {
        // 如果是高度
        altitude = value;
        zoom = Math.round(baseZoom - Math.log2(altitude / 100)); // 根据公式计算缩放级别并四舍五入
        zoom = Math.max(0, Math.min(22, zoom)); // 限制在 0-22 范围内
    } else {
        throw new Error('Invalid unit in URL');
    }

    // 返回解析结果
    return {
        latitude: lat,
        longitude: lng,
        zoom: zoom,
        altitude: altitude,
        baseZoom: baseZoom
    };
}

function parseLocation(locationStr) {
    // 解析字符串
    const [firstStr, secondStr] = locationStr.split(',');

    // 检查格式
    if (!firstStr || !secondStr) {
        throw new Error('经纬度格式不正确，请输入 "经度,纬度" 或 "纬度,经度" 格式的字符串');
    }

    // 转换为数字
    const first = parseFloat(firstStr);
    const second = parseFloat(secondStr);

    // 检查是否为有效数字
    if (isNaN(first) || isNaN(second)) {
        throw new Error('经纬度必须是数字');
    }

    // 定义中国的经纬度范围
    const chinaLngRange = [73, 135];
    const chinaLatRange = [18, 54];

    // 判断哪个数值是经度，哪个是纬度
    let lng, lat;
    if (first >= chinaLngRange[0] && first <= chinaLngRange[1] && second >= chinaLatRange[0] && second <= chinaLatRange[1]) {
        // 如果第一个数值在经度范围内，第二个数值在纬度范围内，则认为是 "经度,纬度"
        lng = first;
        lat = second;
    } else if (second >= chinaLngRange[0] && second <= chinaLngRange[1] && first >= chinaLatRange[0] && first <= chinaLatRange[1]) {
        // 如果第二个数值在经度范围内，第一个数值在纬度范围内，则认为是 "纬度,经度"
        lng = second;
        lat = first;
    } else {
        // 如果无法确定顺序，则默认按照 "经度,纬度" 解析
        lng = first;
        lat = second;
    }

    // 检查范围
    if (lng < -180 || lng > 180 || lat < -90 || lat > 90) {
        throw new Error('经纬度范围不正确：经度范围为 -180 到 180，纬度范围为 -90 到 90');
    }

    // 返回解析后的经纬度
    return { lng, lat };
}


export { parseGoogleMapsUrl, parseLocation };
